/**
 * @file tal_zigbee_local_auto_event.h
 * @brief This is tal_zigbee_local_auto_event file
 * @version 1.0
 * @date 2022-06-14
 *
 * @copyright Copyright 2021-2022 Tuya Inc. All Rights Reserved.
 *
 */

#ifndef __TAL_ZIGBEE_LOCAL_AUTO_EVENT_H__
#define __TAL_ZIGBEE_LOCAL_AUTO_EVENT_H__

#include "tuya_cloud_types.h"
#include "tuya_error_code.h"

#ifdef __cplusplus
extern "C" {
#endif

/***********************************************************************
 ********************* constant ( macro and enum ) *********************
 **********************************************************************/
#define MAX_EVENT_NUM 48                // 单个设备最多支持的子条件的总数（针对一个设备的所有子条件存放在一个数组中，

#define EVENT_TRIGGER_EDGE  0           // 条件触发类型：边缘触发
#define EVENT_TRIGGER_KEEP  1           // 条件触发类型：连续触发



/***********************************************************************
 ********************* struct ******************************************
 **********************************************************************/
#pragma pack (1)
                                        // 一个子条件
typedef struct {
    UINT16_T pub_address;               // 为 0 表示该子条件是作废的
    UINT8_T  dpid;
    UINT8_T  dpkind;
    struct {
        UINT8_T  trigger:1;             // 触发模式, 0 = 边缘; 1 = 连续
        UINT8_T  rev:1;                 // 是且规则还是或规则, 0 = 或; 1 = 且（目前仅仅支持全且或全或）
        UINT8_T  pre_result:1;          // 用来标记子条件是否满足, 1 = 满足, 0 = 不满足(上次的真假值) <-- 对于边缘型触发，上次的真假需要为假，本次需要为真
        UINT8_T  cur_result:1;          // 用来标记子条件是否满足, 1 = 满足, 0 = 不满足(本次的真假值)
        UINT8_T  op:4;
    } attr;
    UINT16_T a;
    UINT16_T b;

    UINT8_T  next_index;                // 用来指明同一个条件序列中该子条件的下一个子条件的偏移（针对一个设备的所有子条件存放在一个数组中）
    UINT8_T  event_list_index;          // 用来指明该子条件属于哪一个条件序列（针对一个设备的所有条件序列放在一个数组中）
} TAL_ZIGBEE_LOCAL_AUTO_EVENT_T;          // 11

                                        // 一个条件序列
typedef struct {
    struct attr_s {
        UINT8_T  trigger:1;             // 触发模式, 0 = 边缘; 1 = 连续
        UINT8_T  rule:1;                // 是任一还是所有子条件满足就认为满足, 0 = 任一; 1= 所有
        UINT8_T  pre_result:1;          // 用来标记子条件是否满足, 1 = 满足, 0 = 不满足(上次的真假值) <-- 对于边缘型触发，上次的真假需要为假，本次需要为真
        UINT8_T  cur_result:1;          // 用来标记子条件是否满足, 1 = 满足, 0 = 不满足(本次的真假值)
        UINT8_T  num:4;                 // 子条件数量
    } attr;                             // 条件序列属性
    UINT8_T  head_event_index;          // 一个条件序列的第一个子条件的偏移（针对一个设备的所有子条件存放在一个数组中）
} TAL_ZIGBEE_LOCAL_AUTO_EVENT_LIST_T;     // 2
#pragma pack ()

/***********************************************************************
 ********************* variable ****************************************
 **********************************************************************/
extern TAL_ZIGBEE_LOCAL_AUTO_EVENT_T local_auto_events[];

/***********************************************************************
 ********************* function ****************************************
 **********************************************************************/

/**
 * @brief tal_zigbee_local_auto_event_init
 *
 * @param[in] param: none
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
UINT8_T tal_zigbee_local_auto_event_init(VOID_T);

/**
 * @brief tal_zigbee_local_auto_event_engine
 *
 * @param[in] src_addr: src_addr
 * @param[in] dpid: dpid
 * @param[in] dpkind: dpkind
 * @param[in] *params: *params
 * @param[in] params_len: params_len
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
UINT8_T tal_zigbee_local_auto_event_engine(UINT16_T src_addr, UINT8_T dpid, UINT8_T dpkind, UINT8_T *params, UINT8_T params_len);

/**
 * @brief tal_zigbee_local_auto_event_inseart
 *
 * @param[in] event_list_index: event_list_index
 * @param[in] num: num
 * @param[in] *params: *params
 * @param[in] params_len: params_len
 * @param[out] *offset: *offset
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
UINT8_T tal_zigbee_local_auto_event_inseart(UINT8_T event_list_index, UINT8_T num, UINT8_T *params, UINT8_T params_len, UINT8_T *offset);

/**
 * @brief tal_zigbee_local_auto_event_print
 *
 * @param[in] param: none
 *
 * @return OPRT_OK on success. Others on error, please refer to tuya_error_code.h
 */
VOID_T tal_zigbee_local_auto_event_print(VOID_T);


#ifdef __cplusplus
}
#endif

#endif /* __TAL_ZIGBEE_LOCAL_AUTO_EVENT_H__ */

